csv_util.h \
defs.h \
explorist_ini.h \
+ filter.h \
filterdefs.h \
garmin_device_xml.h \
garmin_fs.h \
--- /dev/null
+/*
+
+ Filter skeleton:
+
+ Simply copy this file to <your_filter_name>.c and
+ rename all filter_skeleton tokens to <your_filter_name>. Replace
+ the stupid name and address in the Copyright few lines below.
+ To active your new filter you have to create a new section in
+ filter_vecs and finally add complying statements to Makefile.
+
+ Copyright (C) YYYY John Doe, anybody@wherever.com
+ Copyright (C) 2001-YYYY Robert Lipe, robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
+
+ */
+
+#include "defs.h"
+#include "filterdefs.h"
+
+#define MYNAME "filter_skeleton"
+
+#if FILTERS_ENABLED
+
+// Any arg in this list will appear in command line help and will be
+// populated for you.
+static
+arglist_t filter_skeleton_args[] = {
+// {"foo", &fooopt, "The text of the foo option in help",
+// "default", ARGYTPE_STRING, ARG_NOMINMAX} ,
+ ARG_TERMINATOR
+};
+
+/*******************************************************************************
+* %%% global callbacks called by gpsbabel main process %%% *
+*******************************************************************************/
+
+static void
+filter_skeleton_init(const char* args)
+{
+ /* Called before filter processing */
+
+ /* optional. If not needed, delete and replace entry in vecs with NULL */
+
+ /* This may be used to parse filter options, allocate memory, and do other
+ * housekeeping that should be done before filtering */
+}
+
+static void
+filter_skeleton_process() /* this procedure must be present in vecs */
+{
+// Here is how you register callbacks for all waypoints, routes, tracks.
+// waypt_disp_all(waypt)
+// route_disp_all(head, tail, rtept);
+// track_disp_all(head, tail, trkpt);
+}
+
+static void
+filter_skeleton_deinit()
+{
+ /* called after filter processing */
+
+ /* optional. If not needed, delete and replace entry in vecs with NULL */
+
+ /* This should be used to clean up any memory allocations that are no longer
+ * needed after the filter terminates. */
+}
+
+static void
+filter_skeleton_exit()
+{
+ /* called on program exit */
+
+ /* optional. If not needed, delete and replace entry in vecs with NULL */
+
+ /* You should not need this for simple filters, but it may be used to
+ * clean up memory allocations that must persist from one invocation of
+ * your filter to the next (for example, the stack in the stack filter.)
+ * Note that this member will be called even if your filter has not been
+ * used, so it *cannot* assume that _init or _process has been called
+ * previously. */
+}
+
+/*******************************************************************************/
+
+filter_vecs_t filter_skeleton_vecs = {
+ filter_skeleton_init,
+ filter_skeleton_process,
+ filter_skeleton_deinit,
+ filter_skeleton_exit,
+ filter_skeleton_args
+};
+
+/*******************************************************************************/
+#endif // FILTERS_ENABLED
class Filter
{
public:
+ Filter() = default;
+ // Provide virtual public destructor to avoid undefined behavior when
+ // an object of derived class type is deleted through a pointer to
+ // its base class type.
+ // https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP52-CPP.+Do+not+delete+a+polymorphic+object+without+a+virtual+destructor
+ virtual ~Filter() = default;
+ // And that requires us to explictly default the move and copy operations.
+ // https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c21-if-you-define-or-delete-any-default-operation-define-or-delete-them-all.
+ Filter(const Filter&) = default;
+ Filter& operator=(const Filter&) = default;
+ Filter(Filter&&) = default;
+ Filter& operator=(Filter&&) = default;
+
virtual arglist_t* get_args() = 0;
virtual void init()
+++ /dev/null
-/*
-
- Filter skeleton:
-
- Simply copy this file to <your_filter_name>.c and
- rename all filter_skeleton tokens to <your_filter_name>. Replace
- the stupid name and address in the Copyright few lines below.
- To active your new filter you have to create a new section in
- filter_vecs and finally add complying statements to Makefile.
-
- Copyright (C) YYYY John Doe, anybody@wherever.com
- Copyright (C) 2001-YYYY Robert Lipe, robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
-
- */
-
-#include "defs.h"
-#include "filterdefs.h"
-
-#define MYNAME "filter_skeleton"
-
-#if FILTERS_ENABLED
-
-// Any arg in this list will appear in command line help and will be
-// populated for you.
-static
-arglist_t filter_skeleton_args[] = {
-// {"foo", &fooopt, "The text of the foo option in help",
-// "default", ARGYTPE_STRING, ARG_NOMINMAX} ,
- ARG_TERMINATOR
-};
-
-/*******************************************************************************
-* %%% global callbacks called by gpsbabel main process %%% *
-*******************************************************************************/
-
-static void
-filter_skeleton_init(const char* args)
-{
- /* Called before filter processing */
-
- /* optional. If not needed, delete and replace entry in vecs with NULL */
-
- /* This may be used to parse filter options, allocate memory, and do other
- * housekeeping that should be done before filtering */
-}
-
-static void
-filter_skeleton_process() /* this procedure must be present in vecs */
-{
-// Here is how you register callbacks for all waypoints, routes, tracks.
-// waypt_disp_all(waypt)
-// route_disp_all(head, tail, rtept);
-// track_disp_all(head, tail, trkpt);
-}
-
-static void
-filter_skeleton_deinit()
-{
- /* called after filter processing */
-
- /* optional. If not needed, delete and replace entry in vecs with NULL */
-
- /* This should be used to clean up any memory allocations that are no longer
- * needed after the filter terminates. */
-}
-
-static void
-filter_skeleton_exit()
-{
- /* called on program exit */
-
- /* optional. If not needed, delete and replace entry in vecs with NULL */
-
- /* You should not need this for simple filters, but it may be used to
- * clean up memory allocations that must persist from one invocation of
- * your filter to the next (for example, the stack in the stack filter.)
- * Note that this member will be called even if your filter has not been
- * used, so it *cannot* assume that _init or _process has been called
- * previously. */
-}
-
-/*******************************************************************************/
-
-filter_vecs_t filter_skeleton_vecs = {
- filter_skeleton_init,
- filter_skeleton_process,
- filter_skeleton_deinit,
- filter_skeleton_exit,
- filter_skeleton_args
-};
-
-/*******************************************************************************/
-#endif // FILTERS_ENABLED
}
void
-route_disp(const route_head* rh, std::nullptr_t /* wc */)
+route_disp(const route_head* /* rh */, std::nullptr_t /* wc */)
{
// wc == nullptr
}
#include "xmlgeneric.h"
#include <QtCore/QRegExp>
#include <QtCore/QXmlStreamAttributes>
+#include <cassert>
#include <cmath>
#include <cstdio> /* for snprintf */
#include <cstdlib> /* for qsort */
int new_track_flag;
if ((opt_interval == 0) && (opt_distance == 0)) {
- struct tm t1, t2;
// FIXME: This whole function needs to be reconsidered for arbitrary time.
time_t tt1 = buff[i]->GetCreationTime().toTime_t();
time_t tt2 = buff[j]->GetCreationTime().toTime_t();
- t1 = *localtime(&tt1);
- t2 = *localtime(&tt2);
+ const struct tm t1 = *localtime(&tt1);
+ const struct tm t2 = *localtime(&tt2);
new_track_flag = ((t1.tm_year != t2.tm_year) || (t1.tm_mon != t2.tm_mon) ||
(t1.tm_mday != t2.tm_mday));
char c;
const char* cin;
struct tm time;
- int timeparse = 1;
+ bool timeparse = true;
faketime_t result;
- result.force = 0;
+ result.force = false;
i = j = 0;
strncpy(fmtstart, "00000101000000", sizeof(fmtstart));
while ((c = *cin++)) {
if (c=='f') {
- result.force = 1;
+ result.force = true;
continue;
}
if (timeparse) {
if (c == '+') {
fmtstart[i++] = '\0';
- timeparse = 0;
+ timeparse = false;
} else {
if (fmtstart[i] == '\0') {
fatal(MYNAME "-faketime: parameter too long \"%s\"!\n", timestr);
return result;
}
-int TrackFilter::trackfilter_faketime() /* returns number of track points left after filtering */
+void TrackFilter::trackfilter_faketime()
{
- faketime_t faketime;
-
queue* elem, *tmp;
- int i, dropped, inside = 0;
-
- if (opt_faketime != nullptr) {
- faketime = trackfilter_faketime_check(opt_faketime);
- }
- dropped = inside = 0;
+ assert(opt_faketime != nullptr);
+ faketime_t faketime = trackfilter_faketime_check(opt_faketime);
- for (i = 0; i < track_ct; i++) {
+ for (int i = 0; i < track_ct; i++) {
route_head* track = track_list[i].track;
QUEUE_FOR_EACH((queue*)&track->waypoint_list, elem, tmp) {
Waypoint* wpt = (Waypoint*)elem;
- if (opt_faketime != nullptr && (!wpt->creation_time.isValid() || faketime.force)) {
+ if (!wpt->creation_time.isValid() || faketime.force) {
wpt->creation_time = QDateTime::fromTime_t(faketime.start);
faketime.start += faketime.step;
}
}
}
-
- return track_pts - dropped;
}
int TrackFilter::trackfilter_points_are_same(const Waypoint* wpta, const Waypoint* wptb)
typedef struct faketime_s {
time_t start;
int step;
- int force;
+ bool force;
} faketime_t;
faketime_t trackfilter_faketime_check(const char* timestr);
- int trackfilter_faketime(); /* returns number of track points left after filtering */
+ void trackfilter_faketime(); /* returns number of track points left after filtering */
int trackfilter_points_are_same(const Waypoint* wpta, const Waypoint* wptb);
void trackfilter_segment_head(const route_head* rte);